#姓名：伍弘毅
#日期：2019年9月17日
#版本：V1.0
#功能：使用列表的一部分
2

##切片
#在本章中，你一直在学习如何处理列表的所有元素。你还可以处理列表的部分元素——Python称之为切切片
#要创建切片，可指定要使用的第一个元素和最后一个元素的索引
#与函数range()一样，Python在到达你指定的第二个索引前面的元素后停止
#要输出列表中的前三个元素，需要指定索引0~3，这将输出分别为0 、1和2的元素

#example1

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
#代码打印该列表的一个切片，其中只包含三名队员。输出也是一个列表，其中包含前三名队员

#example2

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])
#可以生成列表的任何子集，如提取列表的第2~4个元素，可将起始索引指定为1，并将终止索引指定为4

#example3

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])
#如果你没有指定第一个索引，Python将自动从列表开头开始

#example4

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])
#要让切片终止于列表末尾，也可使用类似的语法。例如，如果要提取从第3个元素到列表末尾的所有元素，可将起始索引指定为2，并省略终止索引
#Python将返回从第3个元素到列表末尾的所有元素
#无论列表多长，这种语法都能够让你输出从特定位置到列表末尾的所有元素

#example5

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])
#负数索引返回离列表末尾相应距离的元素，因此你可以输出列表末尾的任何切片
#例如，如果你要输出名单上的最后三名队员，可使用切片players[-3:]
#example5代码打印最后三名队员的名字，即便队员名单的长度发生变化，也依然如此


##遍历列表
#要遍历列表的部分元素，可在for循环中使用切片

#example6

players = ['charles', 'martina', 'michael', 'florence', 'eli']

print('Here are the first three players on my team:')
for player in players[:3]:
	print(player.title())
#代码没有遍历整个队员列表，而只遍历前三名队员

'''
在很多情况下，切片都很有用。例如，编写游戏时，你可以在玩家退出游戏时将其最终得分加入到一个列表中
然后，为获取该玩家的三个最高得分，你可以将该列表按降序排 列，再创建一个只包含前三个得分的切片
处理数据时，可使用切片来进行批量处理；编写Web应用程序时，可使用切片来分页显示信息，并在每页显示数量合适的信息
'''


##复制列表
#要复制列表，可创建一个包含整个列表的切片，方法是同时省略起始索引和终止索引（[:]）
#这让Python创建一个始于第一个元素，终止于最后一个元素的切片，即复制整个列表

#example7

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)
#我们首先创建了一个名为my_foods的食品列表,然后创建了一个名为friend_foods 的新列表
#我们在不指定任何索引的情况下从列表my_foods中提取一个切片，从而创建了这个列表的副本
#再将该副本存储到变量friend_foods中。打印每个列表后，我们发现它们包含的食品相同

#为核实我们确实有两个列表，下面在每个列表中都添加一种食品
#并核实每个列表都记录了相应人员喜欢的食品

#example8

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)
#与示例example7一样，我们首先将my_foods的元素复制到新列表friend_foods中
#接下来，在每个列表中都添加一种食品：在列表my_foods中添加'cannoli'
#而在friend_foods 中添加'ice cream'
#最后，打印这两个列表，核实这两种食品包含在正确的列表中
#输出表明，'cannoli'包含在你喜欢的食品列表中，而'ice cream'没有
#'ice cream'包含在你朋友喜欢的食品列表中，而'cannoli'没有
#倘若我们只是简单地将my_foods赋给friend_foods，就不能得到两个列表

#在不使用切片的情况下复制列表的情况

#example9

my_foods = ['pizza', 'falafel', 'carrot cake']

#这行不通
friend_foods = my_foods

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)
#这里将my_foods赋给friend_foods，而不是将my_foods的副本存储到friend_foods
#这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表
#因此这两个变量都指向同一个列表。鉴于此，当我们将'cannoli'添加到my_foods中时
#它也将出现在friend_foods中,同样，虽然'ice cream'好像只被加入到了
#friend_foods中，但它也将出现在这两个列表中
#输出表明，两个列表是相同的，这并非我们想要的结果

#注意：基本上，当你试图使用列表的副本时，如果结果出乎意料
#请确认你像第一个示例那样使用切片复制了列表
